package com.atguigu.netty.dubborpc.nettty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * @author: 叶子
 * @date: 2022/04/07 21:07
 **/
public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {
    private ChannelHandlerContext context;//上下文
    private String result;//返回的结果
    private String param;//客户端调用方法时传入的参数

    //与服务器的连接创建后就会被调用，这个方法是第一个被调用的 (1) 括号里的数字是调用顺序
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("chanelActive 被调用");
        context = ctx;//因为在其他方法会使用到ctx
    }

    // 收到服务器的数据后调用该方法(4)
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("channelRead 被调用");
        result = msg.toString();
        notify();//唤醒等待线程
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    //被代理对象调用，发送数据给服务器，-> wait ->等待被唤醒->返回结果(3)(5)
    @Override
    public synchronized Object call() throws Exception {
        System.out.println("call1 被调用");
        context.writeAndFlush(param);
        //进行wait
        wait();//等待channelRead方法获取到服务器的结果后，唤醒
        System.out.println("call2被调用");
        return result;//服务方返回的结果
    }
    //(2)
    void setParam(String param){
        System.out.println("setParam 被调用");
        this.param = param;
    }
}